package com.le.basic.matrix;

import static jdk.nashorn.internal.objects.Global.print;

/**
 * 转圈打印矩阵
 * 要求: 额外空间复杂度为O(1)
 *
 *  1   2   3   4
 *  5   6   7   8   =>   1 2 3 4 5 12 11 10 9 5 6 7  ===> 分圈打印, [1,2,3] ,[4,8],[12,11,10], [9,5] 外圈打印完成,在打印内圈
 *  9   10  11  12
 *
 *
 */
public class Code_05_PrintMatrixSpiralOrder {

    public static void spiralPrint(int[][] matrix){
        int tR = 0; // 第一个点下标
        int tC = 0;
        int dR = matrix.length - 1; // 最后一个点下标
        int dC = matrix[0].length - 1;
        while (tR <= dR && tC <= dC){
            printEdge(matrix,tR++,tC++,dR--,dC--);
        }

    }

    private static void printEdge(int[][] matrix, int tR, int tC, int dR, int dC) {
        if (tR == dR){ // 同行
            for (int i = tC; i <= dC; i++) {
                System.out.print(matrix[tR][i] + "  ");
            }
        }else if (tC == dC){ // 同列
            for (int i = tR; i <= dR; i++) {
                System.out.print(matrix[i][tC] + "  ");
            }
        }else { // 不同行,不同列
            int curR = tR; //0
            int curC = tC; //0
            while (curC != dC){ // 打印第一行 除去最后一个元素
                System.out.print(matrix[tR][curC++] + "  ");
            }// curC=3
            while (curR != dR){ // 打印最后一列,除去最后一个元素
                System.out.print(matrix[curR++][dC] + "  ");
            }//curR=2
            //      3 != 0
            while (curC != tC){ // 打印最后一行,除去第一个元素
                System.out.print(matrix[dR][curC--] + "  ");
            }// curC=0

                 //  2!= 0
            while (curR != tR){ // 打印第一列,除去第一个元素
                System.out.print(matrix[curR--][tC] + "  ");
            }
        }
    }
    public static void main(String[] args) {
        int[][] matrix = {
                { 1, 2, 3, 4 },
                { 5, 6, 7, 8 },
                { 9, 10, 11, 12 }
                //{ 13, 14, 15, 16 }
        };
        spiralPrint(matrix);

    }
}
